/*
GameServer.cpp
定义游戏服务端，负责与客户端通信
*/

#ifndef GAME_SERVER_H
#define GAME_SERVER_H

#include <hv/WebSocketServer.h>
#include <queue>
#include <time.h>
#include <unordered_map>
#include <future>
#include <InteractHandler.h>

using namespace hv;
using namespace std;

/// @brief 游戏服务端
class GameServer {
public:
    /// @brief 服务端刷新频率
    const float rate = 1.0f / 60.0f;
    /// @brief 服务器构造函数
    GameServer();
    /// @brief 全局线程锁（用于锁存缓存区）
    mutex mtxLock;

    /// @brief 地图宽度
    float mapWidth = 2500.0f;
    /// @brief 地图高度
    float mapHeight = 2500.0f;

    /// @brief 回合时间
    float roundTime = 300.0f;

    /// @brief 服务器名称
    string serverName;
    /// @brief 服务器信息
    vector<string> serverInfo;

    /// @brief 传入会话缓存区
    queue<LevelAction> interactBuffer;
    /// @brief 传出会话缓存区
    queue<LevelAction> responseBuffer;

    /// @brief 启动服务器
    /// @param ip 监听IP
    /// @param port 监听端口
    /// @param maxPlayer 建议最大玩家数
    void start(string ip, int port, int maxPlayer);

    /// @brief 游戏主循环对象
    Level level;

private:

    /// @brief WebSocket服务端
    WebSocketService webSocket;
    /// @brief 客户端列表
    vector<WebSocketChannelPtr> clientChannels;
    /// @brief 客户端UUID列表
    vector<string> clientChannelsUuid;
    /// @brief 传入会话处理器句柄
    InteractHandler interactHandler;

    /// @brief 开启服务器
    void startServer(string ip, int port, int maxPlayer);
    /// @brief 开启游戏主循环
    void startHostGame(string ip, int port, int maxPlayer);
    /// @brief 推送到传入会话处理器
    void pushToInteractBuffer(const LevelAction& levelAction);
    /// @brief 处理传入会话
    void handleInteractBuffer();
    /// @brief 向服务端广播会话
    void boardcastResponse();
    /// @brief 删除已断开连接的死客户端
    void deleteDeadChannels();

};

#endif